package com.atguigu.gmall.common.handler;

import com.atguigu.gmall.common.exception.GmallException;
import com.atguigu.gmall.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常处理类
 * 整个项目中只要抛出异常
 *     全局异常处理器注解
 *     Controller  向上抛
 *     Service     向上抛
 *     Mapper     向上抛
 *      已经有了try{} catch 表示由程序员自己处理异常
 *
 *      //异常处理的优先级： 抛出的异常与指定异常更相吻合 优先处理  如果没有 直接使用级别最高的异常方法来处理
 *
 *
 *
 * @author qy
 */
@ControllerAdvice // SSM阶段 SpringMVC课上讲的 全局异常处理器注解
@Slf4j //市面上最好的日志
public class GlobalExceptionHandler {


  //FileNotFoundException.class

    //参数传递异常  绑定异常   参数要求不能为空
    @ExceptionHandler(BindException.class)
    @ResponseBody //此注解 直接把返回结果抛到页面上    //去掉此注解 ：可以跳转指定页面
    public Result error1(BindException e){
        String defaultMessage = e.getAllErrors().get(0).getDefaultMessage();
        log.error(defaultMessage);//日志打印一下异常
        return Result.fail(defaultMessage); //将异常返回到页面上  抛异常到页面
    }

    //方法异常

    /**
     * 自定义异常处理方法  RuntimeException的子类的级别
     * @param e
     * @return
     */
    @ExceptionHandler(GmallException.class)
    @ResponseBody
    public Result error(GmallException e){
        return Result.fail(e.getMessage());
    }

    // 异常级别 ： Exception 级别 使用如下代码进行处理
    @ExceptionHandler(Exception.class)
    @ResponseBody //此注解 直接把返回结果抛到页面上    //去掉此注解 ：可以跳转指定页面
    public Result error(Exception e){
        e.printStackTrace();//打印在控制台
        return Result.fail(); //将异常返回到页面上  抛异常到页面
        //企业做法： 跳转错误页面   服务器太忙  美工前端 美丽页面 提示
    }
}
